home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / circuits / spice2g6.z / spice2g6 / spice / Fortran / mqspof.f < prev    next >
Encoding:
Text File  |  1989-02-03  |  2.4 KB  |  69 lines

  1.       subroutine mqspof(vds,vbs,vgs,vpof,vdsat1,vth,vbin,gamasd,
  2.      $qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb)
  3.       implicit double precision (a-h,o-z)
  4. c
  5. c spice version 2g.6  sccsid=mosarg 3/15/83
  6.       common /mosarg/ vto,beta,gamma,phi,phib,cox,xnsub,xnfs,xd,xj,xld,
  7.      1   xlamda,uo,uexp,vbp,utra,vmax,xneff,xl,xw,vbi,von,vdsat,qspof,
  8.      2   beta0,beta1,cdrain,xqco,xqc,fnarrw,fshort,lev
  9. c spice version 2g.6  sccsid=status 3/15/83
  10.       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
  11.      1   xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon,
  12.      2   iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile
  13. c
  14. c     vdsat1=dmax1(vds,vdsat1)+1.0d-3
  15.       if( lev .eq. 3 ) goto 50
  16.       if( lev .ne. 2 ) goto 1000
  17.       call mosq2(vds,vbs,vgs,vdsat,vth,vbin,gamasd,cox,phi,
  18.      $qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb)
  19.       if (vds.ge.vdsat) go to 80
  20.       call mosq2(vds,vbs,vpof,vdsat1,vth,vbin, gamasd,cox,phi,
  21.      $qg1,qcpof1,qb1,cggb1,cgdb1,cgsb1,cbgb1,cbdb1,cbsb1)
  22.       call mosq2(vdsat,vbs,vgs,vdsat,vth,vbin, gamasd,cox,phi,
  23.      $qg2,qcpof2,qb2,cggb2,cgdb2,cgsb2,cbgb2,cbdb2,cbsb2)
  24.       goto 75
  25.    50 call mosq3(vds,vbs,vpof,vdsat1,vth,vbin, gamasd,cox,phi,
  26.      $qg,qcpof,qb,cggb1,cgdb1,cgsb1,cbgb1,cbdb1,cbsb1)
  27.       call mosq3(vds,vbs,vgs,vdsat,vth,vbin,gamasd,cox,phi,
  28.      $qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb)
  29.    75 if(vgs.gt.vpof. or .vds.lt.vdsat) goto 100
  30.    80 xqc = xqco
  31.       goto 1000
  32. c
  33. c     tangential limiting of qs
  34. c
  35.   100 csgb1=-(1.0d0-xqco)*(cggb1+cbgb1)
  36.       qs=csgb1*(vgs-vpof)
  37.      1   +(1.0d0-xqco)*qcpof1
  38. c      write(iofile,*) "vgs,vds,qc,cggb,cgdb,cgsb,cbgb,cbdb,cbsb =",
  39. c    1   vgs,vds,qc,cggb,cgdb,cgsb,cbgb,cbdb,cbsb
  40. c      write(iofile,*) "vpof,vdsat,vdsat1,qcpof1,qcpof2,qs,csgb1 =",
  41. c    1   vpof,vdsat,vdsat1,qcpof1,qcpof2,qs,csgb1
  42.       qspof2=(1.0d0-xqco)*qcpof2
  43.       if (dabs(qs) .lt. dabs(qspof2)) qs=qspof2
  44.       if( dabs( qs ) .ge. 0.5d0 * dabs( qc ) ) goto 200
  45. c     csdb=-0.25d0*(cgdb+cbdb)
  46. c     qs=qs+csdb*(vdsat-vds)
  47. c     xqc=dmin1(0.5d0,(qc-qs)/qc)
  48.       xqc=0.5d0
  49. c      write(iofile,*) "qs,xqc =",
  50. c    1   qs,xqc
  51.       goto 1000
  52.   200 qd = qc - qs
  53.       xqc = qd / qc
  54. c     write(iofile,*) "200,qs,qd,xqc =",
  55. c    1   qs,qd,xqc
  56. c
  57. c     constant limiting of qs
  58. c
  59. c 100 qdpof = qcpof * xqco
  60. c     qspof = qcpof - qdpof
  61. c     if( dabs( qspof ) .gt. 0.5d0 * dabs( qc ) ) goto 200
  62. c     xqc = 0.5d0
  63. c     goto 1000
  64. c 200 qd = qc - qspof
  65. c     qs = qspof
  66. c     xqc = qd / qc
  67.  1000 return
  68.       end
  69.